// 定义函数 : 后面跟的是函数的返回值类型
function getTotal(first: number, second: number): number {
  return first + second
}
// 定义函数的三种方式
// 1. 声明函数
// 2. 函数表达式 ; 常规表达式，箭头函数
function abc1(number1: number, number2: number): number {
  return number1 + number2
}
const abc2 = function (number1: number, number2: number): number {
  return number2 + number1
}
const abc: (number1: number, number2: number) => number = (a, b) => {
  return a * b
}

//函数表达式，定义参数和返回值的两种方式
// 1. 在函数的参数中声明参数类型，在函数的后面声明返回值类型
// 2. 在变量的后面声明参数类型和返回值类型，类似箭头函数的类型的声明
const func = function (num1: number, num2: number): number {
  return num1 + num2
}
const func1: (str: string) => string = function (str) {
  return str
}
const abc3: (number1: number, number2: number) => number = (a, b) => {
  return a * b
}

// 函数的返回值类型
// 1. 当没有返回值时，返回值类型为void
function consoleTree(): void {
  console.log("无返回值")
}

//2. 返回值为never， 即永远不会执行完后面的代码

// function errorEmitter ():never {
//    throw new Error();
// }
function errorEmitter(): never {
  if (true) {
    console.log(123)
  }
  while (true) {}
}

// 当函数的参数为对象解构时, 解构参数的声明类型要在对象后面进行声明
function addTree({ first, second }: { first: number; second: number }): number {
  return first + second
}
